<?php
/**
 * Classe gérant l'affichage d'une séance du planning
 *
 * @category librairies
 * @package planning
 *
 * @author Mickaël CASTANHEIRO
 * @version 1.0
 */
class PlanningSeance extends shBase {
    /**
     * Constantes
     */
    public static $COULEURS = array('5f9df2','59d9ad', 'abee9b', '777777', 'f37dd9', 'af85e8',  'f5614e', 'dddddd');

    /**
     * @access protected
     * @var integer
     */
    protected $id;
    protected $planning;
    protected $promotion;

    /***#@+
     * @access protected
     * @var string
     */
    protected $intitule;
    protected $enseignant;
    protected $salle;

    protected $jour;
    protected $heureDebut;
    protected $heureFin;

    protected $couleur;
    /**#@-*/

    /**
     * @access protected
     * @var boolean
     */
    protected $admin;

    /**
     * @access protected
     * @var array
     */
    protected $groupes;

    /**
     * Constructeur de la classe
     */
    public function __construct() {
	$this->couleur = 'aaa';
	$this->groupes = array();
	$this->admin = false;
    }
    /**
     * Modifie l'accesseur pour un passage par référence obligatoire
     * @param <Planning> planning parent
     * @return <PlanningSeance> this
     */
    public function setPlanning(&$_planning) {
	$this->planning = &$_planning;
	return $this;
    }

    /**
     * Gère l'affichage d'une séance
     * @param <integer> Mode d'affichage
     */
    public function display($mode = Planning::SEMAINE) {
	// Détermine la couleur
	$planningPromotions = $this->planning->getPromotions();
	if ( sizeof($planningPromotions) > 1 ) {
	    $couleur = self::$COULEURS[array_search($this->promotion, $planningPromotions)];
	}
	else {
	    $couleur = $this->couleur;
	}

	$template = new shTemplate;
	$template->setPath(DIR_TEMPLATES . '_planningSeance.tpl');
	$template
		->addData('id_seance', $this->id)
		->addData('couleur', $couleur)
		->addData('enseignant', $this->enseignant)
		->addData('intitule', $this->intitule)
		->addData('salle', $this->salle)
		->addData('heureDebut', DateTime::createFromFormat('H:i:s', $this->heureDebut)->format('H\hi'))
		->addData('heureFin', DateTime::createFromFormat('H:i:s', $this->heureFin)->format('H\hi'))
		->addData('admin', $this->admin);

	// Selon le mode, valeurs de base différentes
	switch ( $mode ) {
	    case Planning::SEMAINE:
		$headerTop = 27; // Hauteur du header en px
		$hourHeight = 36; // Hauteur d'une heure en px
		$width = 130; // Largeur d'une séance en px
		break;
	}

	$decalageTotalPourLesGroupes = $width/5;

	// Calculs concernant la séance
	$heureDebut = DateTime::createFromFormat('H:i:s', $this->heureDebut)->format('H\hi');
	$heureFin = DateTime::createFromFormat('H:i:s', $this->heureFin)->format('H\hi');

	$duree = Date::timeToFloat(Date::timeDifference($this->heureDebut, $this->heureFin)); // Durée d'une séance en heures,minutes,secondes
	$top = $hourHeight*(Date::timeToFloat($this->heureDebut)-8) + 2; // Distance depuis le haut du planning en px
	$left = 0; // Distance depuis le bord de la journée en px
	$height = round(($hourHeight*$duree) - 5); // Hauteur de la séance en px

	$positionIntitule = round($height/2) - 8;                    // Position de l'intitulé du cours dans la case
	//if ( $positionIntitule > 10 ) $positionIntitule -= 10;  //
	if ( !empty($this->salle) OR !empty($this->groupes) ) $positionIntitule -= 5;
	if ( !empty($this->enseignant) ) $positionIntitule -= 5;
	if ( !empty($this->groupes) ) $positionIntitule -= 10;


	// Gestion des groupes si la séance est sous forme de groupe(s)
	if ( !empty($this->groupes) OR ( ($this->admin) AND empty($this->groupes) ) ) {
	    $nbGroupesChevauchement = 1;
	    $positionSeanceParmiLesGroupes = 0;

	    foreach($this->planning->getSeances() AS $id_promotion=>$seances_promotion) {
		if ( !empty($seances_promotion[$this->jour]) ) {
		    foreach ( $seances_promotion[$this->jour] AS $seance ) {
			// S'il y a chevauchement des horaires
			if ( Date::timeOver($this->heureDebut, $this->heureFin, $seance->getHeureDebut(), $seance->getHeureFin()) ) {
			    if (( $seance->getId() == $this->id ) AND ( $this->promotion == $seance->getPromotion() )) {
				$positionSeanceParmiLesGroupes = $nbGroupesChevauchement-1;
			    }
			    else {
				$nbGroupesChevauchement++;
			    }
			}
		    }
		}
	    }


	    $isGroupes = 0;
	    // Si mode admin et pas de groupe (cours mutualisé ou en même temps)
	    if ( ($this->admin) AND empty($this->groupes) AND ( $nbGroupesChevauchement > 1 ) ) {
		$this->groupes = array(''); // Nom de la filière/spécialité ?
		$isGroupes = 1;
	    }
	    elseif ( !$this->admin ) {
		$isGroupes = 1;
	    }
	   
	}

	// Affichage pour chaque groupe
	if ( !empty($this->groupes) ) { 
	    $width = round($width - $decalageTotalPourLesGroupes);
	    $i = 0;
	    foreach ( $this->groupes AS $groupe ) {
		if ( ($nbGroupesChevauchement+$i) > 1 )
		    $left = round($decalageTotalPourLesGroupes / ($nbGroupesChevauchement-$isGroupes) * ($positionSeanceParmiLesGroupes+$i));
		$i++;

		// Affichage dans le template
		$template
			->addData('groupe', $groupe)
			->addData('top', $top)
			->addData('left', $left)
			->addData('height', $height)
			->addData('width', $width)
			->addData('positionIntitule', $positionIntitule)
                        ->addData('promotions', implode('-', $planningPromotions));
		$template->display();
	    }
	    return;
	}

	// Affichage dans le template
	else {
	    $template
		    ->addData('top', $top)
		    ->addData('left', $left)
		    ->addData('height', $height)
		    ->addData('width', $width)
		    ->addData('positionIntitule', $positionIntitule)
                    ->addData('promotions', implode('-', $planningPromotions));
	    $template->display();
	}


    }
}
?>